<?php

/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

namespace EasyActionPHP\Util;

/**
 * Classe com funções utilitárias.
 *
 * @author Flavio de Vasconcellos (skavurzka at users.sourceforge.net)
 * @since 2007/06/04
 * @package EasyAction2
 * @subpackage Utils
 * @version $id$
 * @license http://www.gnu.org/copyleft/gpl.html GPL
 */
class ActionUtil {

    /**
     * Converte um valor "um_valor" para "umValor".
     *
     * @param String field
     * @return String valor convertido.
     * @access private
     */
    static private function convert($field) {
        $output = '';
        $toogleUpper = false;
        for ($i = 0; $i < strlen($field); $i++) {
            if ($i == 0 && ereg('[a-zA-Z]', substr($field, 0, 1))) {
                $output .= strtoupper(substr($field, 0, 1));
            } elseif (ereg('[_-]', substr($field, $i, 1))) {
                $toogleUpper = true;
            } elseif (ereg('[a-zA-z]', substr($field, $i, 1)) && $toogleUpper) {
                $toogleUpper = false;
                $output .= strtoupper(substr($field, $i, 1));
            } else {
                $output .= substr($field, $i, 1);
            }
        }
        return $output;
    }

    /**
     * Converte uma variável no padrão Getter.
     *
     * @access public
     * @param String name Referencia de valor a ser convertido.
     * @return String variável no padrão Getter.
     */
    static public function toGetter($name) {
        return 'get' . self::convert($name);
    }

    /**
     * Converte uma variável no padrão Setter.
     *
     * @access public
     * @param String name Referencia de valor a ser convertido.
     * @return String variável no padrão Setter.
     */
    static public function toSetter($name) {
        return 'set' . self::convert($name);
    }

    /**
     * Avalia se um variável é vazia ou nula.
     *
     * @access public
     * @return Bool TRUE se é nula ou vazia, FALSE caso contrário.
     */
    static public function emptyOrNull($var) {
        if (is_null($var)) {
            return TRUE;
        }
        if (!isset($var)) {
            return TRUE;
        }
        if (is_string($var)) {
            if (strlen(trim(($var))) == 0) {
                return TRUE;
            }
        }
        return FALSE;
    }

    /**
     * Retorna a hora corrente no formato TIMESTAMP.
     *
     * @access public
     * @return String Hora em formatação TIMESTAMP
     */
    static public function getCurrentTimestamp() {
        return date('Y-m-d H:i:s', time());
    }

    static public function getCurrentDate() {
        return date('Y-m-d', time());
    }

    static public function strToFloat($string_number, $decimal = null, $thousands = null) {
        $num_format = localeconv();
        $decimal_point = is_null($decimal) ? $num_format['decimal_point'] : $decimal;
        $mon_thousands_sep = is_null($thousands) ? $num_format['mon_thousands_sep'] : $thousands;

        return str_replace($decimal_point, '.', str_replace($mon_thousands_sep, '', $string_number));
    }

    static public function europeanDateToUnix($date, $delimiter = null) {
        if (!isset($delimiter))
            $delimiter = '-';
        if (self::emptyOrNull($date))
            return '';
        $new_date = explode($delimiter, $date);
        return $new_date[2] . '-' . $new_date[1] . '-' . $new_date[0];
    }

    static public function unixToEuropeanDate($date) {
        if (self::emptyOrNull($date))
            return '';
        $new_date = explode('-', $date);
        return $new_date[2] . '-' . $new_date[1] . '-' . $new_date[0];
    }

    static public function validateURL($URL) {
        if (self::emptyOrNull($URL))
            return '';
        $domain = "([[:alpha:]][-[:alnum:]]*[[:alnum:]])(\.[[:alpha:]][-[:alnum:]]*[[:alpha:]])+";
        $dir = "(/[[:alpha:]][-[:alnum:]]*[[:alnum:]])*";
        $page = "(/[[:alpha:]][-[:alnum:]]*\.[[:alpha:]]{3,5})?";
        $getstring = "(\?([[:alnum:]][-_%[:alnum:]]*=[-_%[:alnum:]]+)(&([[:alnum:]][-_%[:alnum:]]*=[-_%[:alnum:]]+))*)?";
        $pattern = '^' . $domain . $dir . $page . $getstring . '$';
        return eregi($pattern, $URL);
    }

    static public function autolink($value) {
        if (self::emptyOrNull($value))
            return '';
        if (eregi('^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$', $value)) {
            $output = '<a href="mailto:' . $value . '">' . $value . '</a>';
        } elseif (self::validateURL($value)) {
            $output = '<a href="http://' . $value . '">' . $value . '</a>';
        }
        return $output;
    }

    /**
     * Valida CPF e CNPJ retornando true caso sejam válidos e false caso não sejam.
     * 
     * Features:
     *          Aceita CPFs e CNPJs com ou sem pontos, traços e barra
     *          Valida contra caracteres não numéricos
     *          Valida contra CPFs e CNPJs compostos de um único algarismo. Por exemplo: 111.111.111-11
     *          é uma função 2 em 1
     *          Tem a menor quantidade de linhas do mercado
     * 
     * Adaptado de http://gevaspm.wordpress.com/2007/12/14/cpfj-validacao-de-cpf-e-cnpj/ visto em 24/05/2013
     */
    static function validateBrazilianCPFCNPJ($number) {

        $l = strlen($number = preg_replace("/[^0-9\s]/", "", $number));
        if ((!is_numeric($number)) || (!in_array($l, array(11, 14))) || (count(count_chars($$number, 1)) == 1)) {
            return false;
        }
        $cpfj = str_split(substr($number, 0, $l - 2));
        $k = 9;
        for ($j = 0; $j < 2; $j++) {
            for ($i = (count($cpfj)); $i > 0; $i--) {
                $s += $cpfj[$i - 1] * $k;
                $k--;
                $l == 14 && $k < 2 ? $k = 9 : 1;
            }
            $cpfj[] = $s % 11 == 10 ? 0 : $s % 11;
            $s = 0;
            $k = 9;
        }
        return $number == join($cpfj);
    }

    /**
     * Cálcula a diferença em dias entre duas datas.
     * 
     * @param type $dateInitial - data formato yyyy-mm-dd
     * @param type $dateFinal - data formato yyyy-mm-dd
     * @param type $delimiter - padrão '-'
     * @return type - o resultado em dias
     */
    static function diffDates($dateInitial, $dateFinal, $delimiter = null) {
        if (!isset($delimiter))
            $delimiter = '-';
        $di = explode($delimiter, $dateInitial);
        $df = explode($delimiter, $dateFinal);
        $t1 = mktime(0, 0, 0, $di[1], $di[2], $di[0]);
        $t2 = mktime(0, 0, 0, $df[1], $df[2], $df[0]);
        return floor(($t2 - $t1) / (86400));
    }

}

?>